﻿using System;
using nkstdgia.common.ThamDinhGia.BusinessObjects;

namespace nkstdgia.main
{
    internal class TinhGia
    {
        /*  *  Giá đất = Giá giao dịch[mục 1.4] – Giá công trình [I]
            ** (I) Giá công trình = Diện tích sàn xây dựng[mục 3.4 – diện tích được công nhận] x Đơn giá xây dựng[mục 3.7] x Chất lượng còn lại [II]
            ***(II) chất lượng còn lại có 2 các tính:
            ***(II.1)( cách 1) Xem bảng “3.5.6 Đánh giá chất lượng còn lại” và bảng “3.5.7 tỉ lệ kết cấu chính”
                   Chất lượng còn lại = (X1*Y1 + X2*Y2 + X3*Y3 + X4*Y4 + X5*Y5)/(Y1 + Y2 + Y3 + Y4 + Y5)
            ***(II.2)(Cách 2)
                   Chất lượng còn lại = 1 – (Tuổi đời hiệu quả[III] / tuổi đời kinh tế[mục 3.8])
            ****(III) tuổi đời hiệu quả = Số năm sử dụng[mục 3.6] – (Số lần sửa chữa[mục 3.10] * 3)
            (trong các công thức: các toán hang “màu đỏ” là các đại lượng đã có sẵn ở input, còn lại các màu khác phải tính ra từ công thức)
            Note: Thực thi cả 2 cách tính và cho ra đồng thời 2 kết quả với tên
            Cách 1: Giá đất theo tỉ lệ các kết cấu chính
            Cách 2: Giá đất theo tuổi đời công trình
         */

        public static bool TinhGiaDat(ref HO_SO_THAM_DINH hstd, THUA_DAT td, GIA_THAM_DINH gtd, CONG_TRINH_XAY_DUNG ctxd, VAT_LIEU_XAY_DUNG vlxd)
        {
            bool isCalculated = false;
            bool tinhCach1 = false;
            bool tinhCach2 = false;
            try
            {
                Double GiaGiaoDich = 0.0;
                GiaGiaoDich = gtd.GIA_GIAO_DICH_TRIEU_DONG >= 0 ? gtd.GIA_GIAO_DICH_TRIEU_DONG : gtd.GIA_GIAO_DICH_CAY_VANG;
                /*
                 * (I) Giá công trình = Diện tích sàn xây dựng[mục 3.4 – diện tích được công nhận]
                                            x Đơn giá xây dựng[mục 3.7]
                                            x Chất lượng còn lại [II]
                 */
                Double GiaCongTrinh = 0.0;
                Double DienTichSanXayDung = ctxd.DIEN_TICH_XD_CONG_NHAN;
                Double DonGiaXayDung = ctxd.DON_GIA_XAY_DUNG;
                Double DienTichCongNhan = td.DIEN_TICH_CONG_NHAN;
                Double ChatLuongConLai = 0.0;

                //Cach 1 : Chất lượng còn lại = (X1*Y1 + X2*Y2 + X3*Y3 + X4*Y4 + X5*Y5)/(Y1 + Y2 + Y3 + Y4 + Y5)
                ChatLuongConLai = (vlxd.CHAT_LUONG_MONG * vlxd.TI_LE_KET_CAU_MONG
                                    + vlxd.CHAT_LUONG_SAN * vlxd.TI_LE_KET_CAU_SAN
                                    + vlxd.CHAT_LUONG_TUONG * vlxd.TI_LE_KET_CAU_TUONG
                                    + vlxd.CHAT_LUONG_TRAN * vlxd.TI_LE_KET_CAU_TRAN
                                    + vlxd.CHAT_LUONG_MAI * vlxd.TI_LE_KET_CAU_MAI)
                                    / (vlxd.TI_LE_KET_CAU_MONG + vlxd.TI_LE_KET_CAU_SAN + vlxd.TI_LE_KET_CAU_TUONG
                                    + vlxd.TI_LE_KET_CAU_TRAN + vlxd.TI_LE_KET_CAU_MAI);
                GiaCongTrinh = DienTichSanXayDung * DonGiaXayDung * ChatLuongConLai;

                //Giá đất = Giá giao dịch[mục 1.4] – Giá công trình [I]
                Double GiaDat = GiaGiaoDich - GiaCongTrinh;
                Double GiaDatBinhQuan = GiaDat / DienTichCongNhan;
                hstd.GIA_DAT_1 = GiaDat;
                hstd.GIA_DAT_BINH_QUAN_1 = GiaDatBinhQuan;
                if (!double.IsInfinity(GiaDat) && GiaDat > 0 && !double.IsInfinity(GiaDatBinhQuan) && GiaDatBinhQuan > 0)
                    tinhCach1 = true;
                else
                {
                    hstd.GIA_DAT_1 = -1;
                    hstd.GIA_DAT_BINH_QUAN_1 = -1;
                }

                //Cach 2 : Chất lượng còn lại = 1 – (Tuổi đời hiệu quả[III] / tuổi đời kinh tế[mục 3.8])
                //tuổi đời hiệu quả = Số năm sử dụng[mục 3.6] – (Số lần sửa chữa[mục 3.10] * 3)
                double TuoiDoiHieuQua = 0.0;
                TuoiDoiHieuQua = ctxd.SO_NAM_SU_DUNG - ctxd.SO_LAN_SUA_CHUA * 3;
                ChatLuongConLai = 1 - (TuoiDoiHieuQua / ctxd.TUOI_DOI_KINH_TE);
                GiaCongTrinh = DienTichSanXayDung * DonGiaXayDung * ChatLuongConLai;

                //Giá đất = Giá giao dịch[mục 1.4] – Giá công trình [I]
                GiaDat = GiaGiaoDich - GiaCongTrinh;
                GiaDatBinhQuan = GiaDat / DienTichCongNhan;
                hstd.GIA_DAT_2 = GiaDat;
                hstd.GIA_DAT_BINH_QUAN_2 = GiaDatBinhQuan;
                if (!double.IsInfinity(GiaDat) && GiaDat > 0 && !double.IsInfinity(GiaDatBinhQuan) && GiaDatBinhQuan > 0)
                    tinhCach2 = true;
                else
                {
                    hstd.GIA_DAT_2 = -1;
                    hstd.GIA_DAT_BINH_QUAN_2 = -1;
                }
            }
            catch (Exception)
            {
                isCalculated = false;
            }

            if(tinhCach1 || tinhCach2)
                isCalculated = true;

            return isCalculated;
        }
    }
}